package com.xxxy.ljh.myapplication.Adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.xxxy.ljh.myapplication.R;
import com.xxxy.ljh.myapplication.Dao.MemberApplicationDao;
import com.xxxy.ljh.myapplication.DaoImpl.MemberApplicationDaoImpl;
import com.xxxy.ljh.myapplication.model.MemberApplication;

import java.util.List;

/**
 * 用于展示并处理成员申请审核列表的适配器类。
 * 此适配器绑定到 RecyclerView，显示每个待审核的申请，并提供“通过”或“拒绝”的操作按钮。
 */
public class ApplicationReviewAdapter extends RecyclerView.Adapter<ApplicationReviewAdapter.ViewHolder> {
    private Context context;
    private List<MemberApplication> applications;
    private MemberApplicationDao applicationDao;

    /**
     * 构造方法，初始化上下文、数据源以及数据库访问对象。
     *
     * @param context      上下文环境，通常为 Activity 或 Fragment 的实例
     * @param applications 待审核的成员申请列表
     */
    public ApplicationReviewAdapter(Context context, List<MemberApplication> applications) {
        this.context = context;
        this.applications = applications;
        this.applicationDao = new MemberApplicationDaoImpl(context);
    }

    /**
     * 创建一个新的 ViewHolder 实例以承载 item 视图。
     *
     * @param parent   父容器视图组
     * @param viewType 视图类型（本实现中未使用）
     * @return 新创建的 ViewHolder 对象
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_application_review, parent, false);
        return new ViewHolder(view);
    }

    /**
     * 将指定位置的数据绑定到对应的 ViewHolder 中。
     * 同时设置“通过”和“拒绝”按钮的点击事件监听器。
     *
     * @param holder   当前 ViewHolder 实例
     * @param position 数据在列表中的索引位置
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        MemberApplication application = applications.get(position);

        holder.tvUserName.setText(application.getUserName());
        holder.tvApplyTime.setText(application.getApplyTime());
        holder.tvClubName.setText(application.getAssociationName());

        // 设置通过按钮点击事件：更新状态为通过并从列表移除该条目
        holder.btnApprove.setOnClickListener(v -> {
            handleApplication(application.getMemberId(), 1, "申请通过");
            removeItem(position);
        });

        // 设置拒绝按钮点击事件：更新状态为拒绝并从列表移除该条目
        holder.btnReject.setOnClickListener(v -> {
            handleApplication(application.getMemberId(), 2, "申请被拒绝");
            removeItem(position);
        });
    }

    /**
     * 处理申请的状态变更逻辑，调用 DAO 层进行数据库更新。
     *
     * @param memberId 成员 ID
     * @param status   审核结果状态码（1 表示通过，2 表示拒绝）
     * @param remark   审核备注信息
     */
    private void handleApplication(int memberId, int status, String remark) {
        // 这里需要获取当前登录用户ID作为审核人
        // 简化处理，使用固定值
        applicationDao.approveApplication(memberId, status, 1, remark);
    }

    /**
     * 移除指定位置的申请项，并通知 RecyclerView 更新界面。
     *
     * @param position 要删除的元素的位置
     */
    private void removeItem(int position) {
        applications.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, applications.size());
    }

    /**
     * 获取当前数据集合的大小。
     *
     * @return 数据项的数量
     */
    @Override
    public int getItemCount() {
        return applications.size();
    }

    /**
     * ViewHolder 类，持有 item_application_review 布局中的各个控件引用，
     * 提高 RecyclerView 滚动性能。
     */
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvUserName, tvApplyTime, tvClubName;
        Button btnApprove, btnReject;

        /**
         * 构造方法，查找并保存布局文件中各组件的引用。
         *
         * @param itemView item 布局视图
         */
        ViewHolder(View itemView) {
            super(itemView);
            tvUserName = itemView.findViewById(R.id.tv_user_name);
            tvApplyTime = itemView.findViewById(R.id.tv_apply_time);
            tvClubName = itemView.findViewById(R.id.tv_club_name);
            btnApprove = itemView.findViewById(R.id.btn_approve);
            btnReject = itemView.findViewById(R.id.btn_reject);
        }
    }
}
